
package com.haiyou.common.console;

import java.util.Scanner;
import java.util.Set;

import com.google.common.collect.Sets;
import com.haiyou.common.util.system.SystemUtils;

/**
 * 
 * 
 * @Description: 控制台输入测试工具
 * @author xingyuan
 * @date 2022年11月15日 上午10:51:45
 */
public class Console {

	/**
	 * 控制台内容捕获器
	 * @author xingyuan
	 * @date 2022年11月15日 上午10:51:45
	 */
	static public interface Catcher {

		/**
		 * 接受并处理控制台输出的内容
		 * 
		 * @param input 控制台输入的内容分割组成的数组
		 * @return
		 */
		void accept(String[] input);
	}

	private static Scanner scanner;
	private static Set<Catcher> catchers = Sets.newConcurrentHashSet();

	static {
		if (SystemUtils.isWindows()) {
			System.err.println("控制台输入\''exit\''或者\''quit\''或者\"shutdown\"安全销毁");
			scanner = new Scanner(System.in);
			new Thread(() -> {
				while (true) {
					String line = scanner.nextLine();
					System.err.println("catch input : " + line);
					if (line != null && !line.isEmpty()) {
						String[] input = line.split("\\s++");
						catchers.forEach(c -> {
							try {
								c.accept(input);
							} catch (Exception e) {
								e.printStackTrace();
							}
						});
					}
				}
			}).start();
		}
	}

	public static void handleInput(Catcher catcher) {
		catchers.add(catcher);
	}

	/**
	 * 控制台输入 shutdown quit exit 将会杀死程序并调起钩子
	 */
	public static void listenerInputExit() {
		handleInput(input -> {
			if (input != null && input.length >= 1) {
				for (String in : input) {
					if (in != null && !in.isEmpty()) {
						if (in.equalsIgnoreCase("shutdown") || in.equalsIgnoreCase("exit")
								|| in.equalsIgnoreCase("quit")) {
							System.err.println("销毁进程\t" + SystemUtils.getPid());
							System.exit(0);
						}
					}
				}
			}
		});
	}


}
